import numpy as np
import cv2 as cv

filename = '../pic/blox.jpg'
img = cv.imread(filename)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 寻找哈里斯角
gray = np.float32(gray)
dst = cv.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)
dst = cv.dilate(dst, None)
# 对角点响应矩阵 dst 进行阈值处理。值高于 0.01 * dst.max() 的像素设置为 255（视为角点），而其他像素设置为 0（不视为角点）
ret, dst = cv.threshold(dst, thresh=0.01 * dst.max(), maxval=255, type=0)
dst = np.uint8(dst)
# 寻找质心 centroids
ret, labels, stats, centroids = cv.connectedComponentsWithStats(dst)

# 定义停止和完善拐角的条件  当位置变化小于 0.001 时停止  100 次迭代后停止
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 100, 0.001)
corners = cv.cornerSubPix(gray, np.float32(centroids), (5, 5), (-1, -1), criteria)

# 绘制 将初始质心和精化的角点位置连接成一个数组 水平堆叠（按列连接）成一个新的数组
res = np.hstack((centroids, corners))
# numpy.int0 is numpy.int64
res = np.int0(res)
# 将所有质心坐标用红色表示
img[res[:, 1], res[:, 0]] = [0, 0, 255]
# 将所有精细化坐标用绿色表示
img[res[:, 3], res[:, 2]] = [0, 255, 0]
cv.imshow('subpixel5', img)

cv.waitKey(0)
cv.destroyAllWindows()
